/*
 * my_printf.h
 *
 *  Created on: Sep 13, 2025
 *      Author: ADMIN
 */

#ifndef DOMAIN_INC_MY_PRINTF_H_
#define DOMAIN_INC_MY_PRINTF_H_

#include "All_In_One.h"

/***********************************************************************************
 ********************************************************************************
 *--------------------------------------------------------------------------
 *                            FILE DESCRIPTION
 *--------------------------------------------------------------------------
 *
 *    File Name    :     my_printf.h
 *    File Module  :     Domain
 *    File Description:  This file is used to make user printf function
 *
 *
 ********************************************************************************
 ***********************************************************************************/



typedef void (*putchar_func_t)(char);

typedef int32_t fixed_t;


/**
 * @brief 设置字符输出函数
 * @param func 指向输出字符函数的指针
 */
void set_putchar_function(putchar_func_t func);

/**
 * @brief 输出单个字符
 * @param c 要输出的字符
 */
void _putchar(char c);

/**
 * @brief 输出字符串
 * @param str 要输出的字符串
 */
void _puts(const char *str);

/**
 * @brief 浮点数转定点数
 * @param f 浮点数
 * @return 对应的定点数
 */
fixed_t float_to_fixed(float f);

/**
 * @brief 定点数转浮点数
 * @param f 定点数
 * @return 对应的浮点数
 */
float fixed_to_float(fixed_t f);

/**
 * @brief 简化版 printf 实现
 * @param format 格式字符串
 * @param ... 可变参数
 *
 * 支持格式：
 * %d, %i - 有符号十进制整数
 * %u - 无符号十进制整数
 * %x, %X - 十六进制整数
 * %c - 单个字符
 * %s - 字符串
 * %f - 浮点数（支持精度控制：%.2f, %.6f等）
 * %% - 百分号字符
 */
void my_printf(const char *format, ...);

/**
 * @brief 带可变参数的 printf 函数
 * @param format 格式字符串
 * @param args 可变参数列表
 */
void my_vprintf(const char *format, va_list args);

/* Define part */
#define FIXED_SHIFT 14
#define FIXED_ONE (1 << FIXED_SHIFT)
#define FLOAT_TO_FIXED(f) ((fixed_t)((f) * FIXED_ONE + ((f) >= 0 ? 0.5 : -0.5)))
#define FIXED_TO_INT(f) ((f) >> FIXED_SHIFT)
#define FIXED_FRAC_PART(f) ((f) & ((1 << FIXED_SHIFT) - 1))



#endif /* DOMAIN_INC_MY_PRINTF_H_ */
